import random

from django.db import models

# 不生成表，作为所有模型的基类
# 定义基础的时间戳，并自动更新
class BaseModel(models.Model):
    # auto_now_add字段是创建时自动添加
    created_time = models.DateTimeField(
    auto_now_add=True,
    # 用灰色小字提供额外的信息或指导，帮助用户理解如何填写字段
    help_text = '创建时间',
    # 则是用于替代默认的字段名，增加可读性
    verbose_name = '创建时间',
    )

    updated_time = models.DateTimeField(
        auto_now=True,
        help_text = '更新时间',
    )

    class Meta:
        # 抽象模型,不生成表，只是作为其他表的基础
        abstract = True


# 出版社表
class Publish(BaseModel):
    name = models.CharField(max_length=50, verbose_name='出版社名')
    addr = models.CharField(max_length=100, verbose_name='出版社地址')
    phone = models.CharField(max_length=11, verbose_name='出版社电话')
    # 定义元数据
    class Meta:
        # db_table 决定了模型在数据库中对应的表名。
        # 如果不修改默认表名，则表名就是app名_模型表
        db_table = 'publish'
        # 决定了模型在Django的admin界面、表单验证错误消息等地方显示的可读名称。
        verbose_name = '出版社表'
        # 如果不改，复数时名字会是“verbose_name”+s
        verbose_name_plural = verbose_name

class UserInfo(BaseModel):
    username = models.CharField(max_length=50, verbose_name='用户')
    password = models.CharField(max_length=50, verbose_name='密码')


class Book(BaseModel):
    level = (
        (0, '不推荐'),
        (1, '推荐'),
        (2, '非常推荐'),
    )
    title = models.CharField(max_length=50, verbose_name = '书名')
    price = models.DecimalField(max_digits=5, decimal_places=2,verbose_name='价格')
    desc = models.TextField(verbose_name='书籍简介')
    sale = models.IntegerField(default=random.randint(50, 980), verbose_name='销售数')
    stock = models.IntegerField(default=random.randint(50, 980), verbose_name='库存数')

    recommend = models.IntegerField(
        choices=level,
        verbose_name='推荐度'
    )
    # img /book_cover/ book_cover.jpg
    cover = models.CharField(max_length=255, verbose_name='书籍封面地址')
    # 作者和图书,多对多关系统
    # 借助Django自动创建第三张表
    authors = models.ManyToManyField(
        to='Author',
    )

    # 图书和出版社是 一对多关系
    publish = models.ForeignKey(
        to = 'Publish',
        # 级联更新和级联删除 当删除关联的出版社时，级联更新关联对象
        on_delete = models.CASCADE
)


    class Meta:
        # 控制数据库的表名
        # 如果不修改默认表名，则表名就是app名_模型表
        db_table = 'book'
        # 添加注释
        verbose_name = '图书表'
        # 如果不改，Django admin后台注册模型显示的就是verbose_name_plural
        verbose_name_plural = verbose_name

# 作者表
class Author(BaseModel):
    gender_choices = (
        (0,'女'),
        (1,'男'),
        (2,'保密'),
    )
    name = models.CharField(max_length=30, verbose_name='姓名')
    age = models.IntegerField(verbose_name='年龄')
    gender = models.IntegerField(
        choices=gender_choices,
        default=2,
        verbose_name='性别'
    )


    # 作者和作者详情是一对一关系
    author_detail = models.OneToOneField(
        to = 'AuthorDetail',
        on_delete = models.CASCADE
    )
    class Meta:
        # 控制数据库的表名
        # 如果不修改默认表名，则表名就是app名_模型表
        db_table = 'author'
        # 添加注释
        verbose_name = '作者表'
        # 如果不改，Django admin后台注册模型显示的就是verbose_name_plural
        verbose_name_plural = verbose_name

# 作者详情表名称
class AuthorDetail(BaseModel):
    phone = models.CharField(max_length=11, verbose_name="电话")
    addr = models.CharField(max_length=100, verbose_name="地址")
    email = models.EmailField(verbose_name="邮箱")

    class Meta:
        # 控制数据库的表名
        # 如果不修改 ,默认的表名是app名字_模型表名
        db_table = 'author_detail'
        verbose_name = '作者详情表'
        verbose_name_plural = verbose_name






